package godraines.swing;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;

public class LoginManager extends JFrame {

	// 로그인. 로그아웃. JPanel 교체
	//JTextField에 placeholder 추가
	private JPanel contentPane;
	private JPanel panel;							// 로그인, 로그아웃, 배너
	private JTabbedPane tabbedPane;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					LoginManager frame = new LoginManager();
					frame.setVisible(true);
					frame.requestFocusInWindow(true);					// 현재 창에 포커스가 걸리도록 지정. 현재 창에 포커스가 걸리도록 요청(true)
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public LoginManager() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 800, 600);
		setLocationRelativeTo(null);	
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));
		
		panel = new JPanel();
		panel.setPreferredSize(new Dimension(10, 100));
		contentPane.add(panel, BorderLayout.NORTH);
		panel.setLayout(new BorderLayout(0, 0));
				
		// 로그인 패널 추가
		panel.add( new LoginPanel(), BorderLayout.EAST );
				
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		contentPane.add(tabbedPane, BorderLayout.CENTER);
		
		JPanel panel_1 = new JPanel();
		tabbedPane.addTab("기 본 검 색", new ImageIcon(LoginManager.class.getResource("/images/menu/new.png")), panel_1, null);
		
		JRadioButton radioButton = new JRadioButton("New radio button");
		panel_1.add(radioButton);
		
		JPanel panel_2 = new JPanel();
		tabbedPane.addTab("상 세 검 색", new ImageIcon(LoginManager.class.getResource("/images/menu/close.png")), panel_2, null);
		
		JCheckBox checkBox = new JCheckBox("New check box");
		panel_2.add(checkBox);
		
		JPanel panel_3 = new JPanel();
		tabbedPane.addTab("마 이 페 이 지", new ImageIcon(LoginManager.class.getResource("/images/menu/exit.png")), panel_3, null);
		// 특정 탭을 비활성화 시킴
		tabbedPane.setEnabledAt(2, false);
		
		JButton btnNewButton = new JButton("New button");
		panel_3.add(btnNewButton);
	}
	
	//LoginManager 에서 선언된 변수 panel을 LoginPanel, LogoutPanel에서도 사용할수 있도록 getter 메서드 추가
	public JPanel getPanel() {
		return panel;
	}
	
	public JTabbedPane getTab() {
		return tabbedPane;
	}
	
}	// LoginManager

//로그인 로그아웃을 클래스로 분할

class LoginPanel extends JPanel {
	
	private JTextField uid;
	private JPasswordField pwd;
	
	public LoginPanel() {
		// 기본 생성자
	
	setPreferredSize(new Dimension(220, 10));
	// panel.add( LoginPanel, BorderLayout.EAST );					클래스로 나누면서 위에 추가하고 여기선 지움
	
	// placeholder 기능을 추가하기 위해 JTextField 기본 생성자를 변경함
	uid = new JTextField() {
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);											// JComponent에 미리 정의된 대로 JText필드를 표시함 (기본기능)
			
			// 사용자 입맛대로 추가 기능 설정
			// placeholder를 표시하기 위해 Graphics2D 클래스 사용
			if (getText().isEmpty()/* && !(FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this)*/ ) {		// getText가 비어있을 때 && 
				Graphics2D g2 = (Graphics2D)g.create();
			g2.setColor( new Color(0,0,255) );
			g2.drawString("아이디", 5, 15);
			g2.dispose();
			}
		}
	};
	uid.setColumns(10);
	
	pwd = new JPasswordField() {
		@Override
		protected void paintComponent(Graphics g) {
			super.paintComponent(g);											// JComponent에 미리 정의된 대로 JText필드를 표시함 (기본기능)
			
			// 사용자 입맛대로 추가 기능 설정
			// placeholder를 표시하기 위해 Graphics2D 클래스 사용
			if (getText().isEmpty() /*&& !(FocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == this) */) {		// getText가 비어있을 때 && 
				Graphics2D g2 = (Graphics2D)g.create();
			g2.setColor( new Color(0,0,255) );
			g2.drawString("패스워드", 5, 15);
			g2.dispose();
			}
		}
	};
	
	pwd.setColumns(10);
	
	JButton loginBtn = new JButton("로그인");
	loginBtn.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			// 로그인 처리
			if ( uid.getText().equals("abc") && pwd.getText().equals("123") ) {			// pwd는 배열로 바꿔서 처리 하도록 바꾸자
				// 패널을 바꾸기 위해 부모 프레임을 알아봄
				LoginManager parent = (LoginManager) SwingUtilities.windowForComponent( ( Component )e.getSource() );
				// 로그아웃 패널 추가
				parent.getPanel().add( new LogoutPanel(), BorderLayout.EAST );
				// 로그인 패널 숨김
				setVisible(false);
				// 비활성 탭 활성화
				parent.getTab().setEnabledAt(2, true);
			} else {
				JOptionPane.showMessageDialog(null, "로그인 실패");
				// 로그인 실패시 입력한 내용 지우기
				uid.setText("");
				pwd.setText("");
			}
		}
	});
	
	loginBtn.setPreferredSize(new Dimension(81, 23));
	loginBtn.setMaximumSize(new Dimension(81, 23));
	
	JButton joinBtn = new JButton("회원가입");
	GroupLayout gl_loginPanel = new GroupLayout(this);
	gl_loginPanel.setHorizontalGroup(
		gl_loginPanel.createParallelGroup(Alignment.LEADING)
			.addGroup(gl_loginPanel.createSequentialGroup()
				.addContainerGap()
				.addGroup(gl_loginPanel.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_loginPanel.createSequentialGroup()
						.addComponent(uid, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(loginBtn))
					.addGroup(gl_loginPanel.createSequentialGroup()
						.addComponent(pwd, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addPreferredGap(ComponentPlacement.RELATED)
						.addComponent(joinBtn)))
				.addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
	);
	gl_loginPanel.setVerticalGroup(
		gl_loginPanel.createParallelGroup(Alignment.LEADING)
			.addGroup(gl_loginPanel.createSequentialGroup()
				.addContainerGap()
				.addGroup(gl_loginPanel.createParallelGroup(Alignment.BASELINE)
					.addComponent(uid, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addComponent(loginBtn))
				.addPreferredGap(ComponentPlacement.RELATED)
				.addGroup(gl_loginPanel.createParallelGroup(Alignment.BASELINE)
					.addComponent(pwd, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addComponent(joinBtn))
				.addContainerGap(42, Short.MAX_VALUE))
	);
	setLayout(gl_loginPanel);
	}	// 기본 생성자
}

class LogoutPanel extends JPanel {
	
	public LogoutPanel() {
		// 기본 생성자
		
	setPreferredSize(new Dimension(220, 10));
	// panel.add(logoutPanel, BorderLayout.WEST);					클래스로 나누면서 위에 추가하고 여기선 지움
	
	JButton logoutBtn = new JButton("로그아웃");
	logoutBtn.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			// 로그아웃 처리
				// 패널을 바꾸기 위해 부모 프레임을 알아봄
				LoginManager parent = (LoginManager) SwingUtilities.windowForComponent( ( Component )e.getSource() );
				// 로그인 패널 추가
				parent.getPanel().add( new LoginPanel(), BorderLayout.EAST );
				// 로그아웃 패널 숨김
				setVisible(false);
				// 활성화 탭 비활성화
				parent.getTab().setEnabledAt(2, false);
		}
	});
	
	JLabel abata = new JLabel("");
	abata.setIcon(new ImageIcon(LoginManager.class.getResource("/images/icon/icon.png")));
	GroupLayout gl_logoutPanel = new GroupLayout(this);
	gl_logoutPanel.setHorizontalGroup(
		gl_logoutPanel.createParallelGroup(Alignment.TRAILING)
			.addGroup(gl_logoutPanel.createSequentialGroup()
				.addContainerGap()
				.addComponent(abata)
				.addPreferredGap(ComponentPlacement.RELATED, 67, Short.MAX_VALUE)
				.addComponent(logoutBtn)
				.addContainerGap())
	);
	gl_logoutPanel.setVerticalGroup(
		gl_logoutPanel.createParallelGroup(Alignment.LEADING)
			.addGroup(gl_logoutPanel.createSequentialGroup()
				.addGroup(gl_logoutPanel.createParallelGroup(Alignment.LEADING)
					.addGroup(gl_logoutPanel.createSequentialGroup()
						.addContainerGap()
						.addComponent(logoutBtn))
					.addGroup(gl_logoutPanel.createSequentialGroup()
						.addGap(18)
						.addComponent(abata)))
				.addContainerGap(18, Short.MAX_VALUE))
	);
	setLayout(gl_logoutPanel);
	}	// 기본 생성자
}